package Jame.app
{
	import flash.display.DisplayObject;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	
	import Jame.manager.JLayerManager;
	import Jame.screen.InJScreen;
	
	import Jets.display.JSprite;
	
	public class JMainApp extends JSprite
	{
		private var ms_nLayer:JLayerManager = null;
		private var ms_stageWidth:Number = 0;
		private var ms_stageHeight:Number = 0;
		
		public function JMainApp()
		{
			super();
		}
		
		override protected function init():void
		{
			this.stage.align = StageAlign.TOP_LEFT;
			this.stage.scaleMode = StageScaleMode.NO_SCALE;
			ms_stageWidth = stage.fullScreenWidth;
			ms_stageHeight = stage.fullScreenHeight;
			JLayerManager.initJLayerManager(this);
			ms_nLayer = JLayerManager.instance;
			super.init();
		}
		
		/**
		 * 启动进入游戏入口
		 */
		public function onMainAppStart():void
		{
			
		}
		
		/**
		 * 焦点激活
		 */
		public function onMainAppFocusIn():void
		{
			
		}
		
		/**
		 * 失去焦点 可以用于暂停等功能
		 */
		public function onMainAppFocusOut():void
		{
			
		}
		
		/**
		 * 获取管理对象
		 */
		public function get layerManager():JLayerManager
		{
			return ms_nLayer;
		}
		
		/**
		 * 请使用layerManager.addScreen 方法来添加具有标示的对象，不要直接使用本方法
		 */
		public function addScreen(screen:InJScreen):void
		{
			super.addChild(screen);
		}
		
		/**
		 * 请使用layerManager.addScreenAt 方法来添加具有标示的对象，不要直接使用本方法
		 */
		public function addScreenAt(screen:InJScreen,index:int):void
		{
			super.addChildAt(screen,index);
		}
		
		/**
		 * 请使用layerManager.removeScreen 方法来删除具有标示的对象，不要直接使用本方法
		 */
		public function removeScreen(screen:InJScreen):void
		{
			super.removeChild(screen);
		}
		
		/**
		 * 请使用layerManager.removeScreenAt 方法来删除具有标示的对象，不要直接使用本方法
		 */
		public function removeScreenAt(index:int):void
		{
			super.removeChildAt(index);
		}
		
		/**
		 * 请使用layerManager.removeAllScreen 不要直接使用本方法
		 */
		public function removeAllScreen():void
		{
			while(super.numChildren)
			{
				super.removeChildAt(0);
			}
		}
		
		override protected function addChildren():void
		{
			super.addChildren();
			this.addEventListener(Event.ACTIVATE,onMainAppFocusInHandler);
			this.addEventListener(Event.DEACTIVATE,onMainAppFocusOutHandler);
			this.onMainAppStart();
		}
		
		private function onMainAppFocusOutHandler(event:Event):void
		{
			this.onMainAppFocusOut()
		}
		
		private function onMainAppFocusInHandler(event:Event):void
		{
			this.onMainAppFocusIn();
		}
		
		public function get stageWidth():Number
		{
			return ms_stageWidth;
		}
		
		public function get stageHeight():Number
		{
			return ms_stageHeight;
		}
		
		/**-----------------禁用的方法---------------------*/
		/**
		 * 默认的方法禁用掉，使用自定义的方法去添加显示对象
		 */
		override public function addChild(child:DisplayObject):DisplayObject
		{
			throw new Error("不能使用该方法");
			return null;
		}
		/**
		 * 默认的方法禁用掉，使用自定义的方法去添加显示对象
		 */
		override public function addChildAt(child:DisplayObject, index:int):DisplayObject
		{
			throw new Error("不能使用该方法");
			return null;
		}
		/**
		 * 默认的方法禁用掉，使用自定义的方法去添加显示对象
		 */
		override public function removeChild(child:DisplayObject):DisplayObject
		{
			throw new Error("不能使用该方法");
			return null;
		}
		override public function removeChildAt(index:int):DisplayObject
		{
			throw new Error("不能使用该方法");
			return null;
		}
		/**
		 * 默认的方法禁用掉，使用自定义的方法去添加显示对象
		 */
		override public function removeChildren(beginIndex:int=0, endIndex:int=2147483647):void
		{
			throw new Error("不能使用该方法");
		}
		/**
		 * 默认的方法禁用掉，使用自定义的方法去添加显示对象
		 */
		override public function getChildAt(index:int):DisplayObject
		{
			throw new Error("不能使用该方法");
			return null;
		}
		/**
		 * 默认的方法禁用掉，使用自定义的方法去添加显示对象
		 */
		override public function getChildByName(name:String):DisplayObject
		{
			throw new Error("不能使用该方法");
			return null;
		}
		/**
		 * 默认的方法禁用掉，使用自定义的方法去添加显示对象
		 */
		override public function getChildIndex(child:DisplayObject):int
		{
			throw new Error("不能使用该方法");
			return null;
		}
	}
}